package com.kk.datastructure.tree.foundactiontree;
//package com.kk.datastructure.tree;
//
//
///**
// * title: 删除节点
// * @author 阿K
// * 2020年12月31日 下午11:57:45 
// */
//public class BinaryTreeDemo3 {
//
//	public static void main(String[] args) {
//
//		// 创建二叉树
//		BinaryTree binaryTree = new BinaryTree();
//
//		// 创建需要的结点
//		HeroNode root = new HeroNode(1, "宋江");
//		HeroNode node2 = new HeroNode(2, "吴用");
//		HeroNode node3 = new HeroNode(3, "卢俊义");
//		HeroNode node4 = new HeroNode(4, "林冲");
//		HeroNode node5 = new HeroNode(5, "关胜");
//
//		// 加入树
//		root.setLeft(node2);
//		root.setRight(node3);
//		node3.setRight(node4);
//		node3.setLeft(node5);
//		binaryTree.setRoot(root);
//		
//		// 删除测试。。
//		System.out.println("删除前：");
//		binaryTree.perOrder();
//		binaryTree.delNode(3);
//		System.out.println("删除后：");
//		binaryTree.perOrder();
//
//	}
//}
//
//// 定义二叉树 
//class BinaryTree {
//
//	// 前序遍历
//	public void perOrder() {
//		if (this.root != null) {
//			this.root.perOrder();
//		} else {
//			System.out.println("二叉树为空，无法遍历~");
//		}
//	}
//
//	private HeroNode root;// 根节点
//
//	public void setRoot(HeroNode root) {
//		this.root = root;
//	}
//
//	// 删除节点
//	public void delNode(int no) {
//		if (this.root != null) {
//			// 1、判空，若只有一个 root 根节点存在，则等价于二叉树置空
//			if (root.getNo() == no) {
//				root = null;
//			} else {
//				// 否则 递归删除
//				root.delNode(no);
//			}
//
//		} else {
//			System.out.println("当前二叉树为空，删个鸡毛？？");
//		}
//	}
//
//}
//
//// 定义节点
//class HeroNode {
//	private int no;
//	private String name;
//	private HeroNode left; // 左节点（默认为null）
//	private HeroNode right; // 右节点（默认为null）
//
//	public HeroNode(int no, String name) {
//		this.no = no;
//		this.name = name;
//	}
//
//	// 节点删除
//	// 1、若删除的节点是叶子节点，则删除该节点
//	// 2、若删除的节点是非叶子节点，则删除该子树
//	public void delNode(int no) {
//
////		2、故当前入门级二叉树是单向的，所以我们是只判断当前节点的子节点是否为需要删除的
////		3、若当前节点的左子节点不为空，并且左子节点就是要删除的节点，就将 this.left =null(既删除)，并返回（return 结束递归）
////		4、若当前节点的右子节点不为空，并且右子节点就是要删除的节点，就将 this.rigth=null (既删除)，并返回（return 结束递归）
////		5、若 以上两步都没有删除节点，那么就进行左子树递归删除
////		6、如若以上三步都没有删除，则进行右子树递归删除
//		if (this.left != null && this.left.no == no) {
//			this.left = null;
//			return;
//		}
//		if (this.right != null && this.right.no == no) {
//			this.right = null;
//			return;
//		}
//		if (this.left != null) {
//			this.left.delNode(no);
//		}
//		if (this.right != null) {
//			this.right.delNode(no);
//		}
//
//	}
//
//	public int getNo() {
//		return no;
//	}
//
//	public void setNo(int no) {
//		this.no = no;
//	}
//
//	public String getName() {
//		return name;
//	}
//
//	public void setName(String name) {
//		this.name = name;
//	}
//
//	public HeroNode getLeft() {
//		return left;
//	}
//
//	public void setLeft(HeroNode left) {
//		this.left = left;
//	}
//
//	public HeroNode getRight() {
//		return right;
//	}
//
//	public void setRight(HeroNode right) {
//		this.right = right;
//	}
//
//	// 节点的前序遍历
//	public void perOrder() {
//		// 1.先输出入父节点
//		System.out.println(this);
//		// 2.递归左子树前序遍历
//		if (this.left != null) {
//			this.left.perOrder();
//		}
//		// 3.递归右子树前序遍历
//		if (this.right != null) {
//			this.right.perOrder();
//		}
//	}
//
//	@Override
//	public String toString() {
//		return "HeroNode [no=" + no + ", name=" + name + "]";
//	}
//}
